import cv2


def sort_contours(cnts, method="left-to-right"):
    reverse = False
    i = 0

    if method == "right-to-left" or method == "bottom-to-top":
        reverse = True

    if method == "top-to-bottom" or method == "bottom-to-top":
        i = 1
    # 这段逻辑是在给轮廓排序
    # 遍历轮廓, 为每个轮廓生成边界矩形, 将结果创建成列表
    boundingBoxes = [cv2.boundingRect(c) for c in cnts]  # 用一个最小的矩形，把找到的形状包起来x,y,h,w
    # zip() 把轮廓列表和边界矩形的列表 同一个索引位置的元素,打成一个元组, 边界矩形的列表是遍历轮廓生成的, 顺序应该是一样的
    # zip()函数把传入的可迭代对象, 对应位置的元素打成元组或者列表, 然后返回一个迭代器
    # sorted() 对zip()函数的结果进行排序, 排序规则由key指定
    # lambda b: b[1][i]  匿名函数, 接收了一个b作为参数, b就是zip结果的元素, b[1][i] 取了元组中的第二个元素第i个索引位置的值, 这个值就是排序依据, 这个i由上面的逻辑指定, 通过参数控制排序的依据
    # zip(*) 是在解包, 将zip打包好的结果, 解包
    (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
                                        key=lambda b: b[1][i], reverse=reverse))

    return cnts, boundingBoxes


def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    """
    缩放图片, 指定一个边另一边会按指定边的的比例缩放
    :param image:
    :param width:
    :param height:
    :param inter:
    :return:
    """
    dim = None
    (h, w) = image.shape[:2]
    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized
